import { Button, Col, Dropdown, Input, Row, Select } from "antd";
import { UserReadPrivateResponse } from "@newstackdev/iosdk-newgraph-client-js";
import { Link } from "react-router-dom";
import { NLView } from "../../types";
import { Searchicon } from "../../Components/Icons/Searchicon";
import { UsersList } from "../../Components/UserWidget";
import { json } from "overmind";
import { uniqBy } from "lodash";
import { useActions, useAppState } from "../../overmind";
import { useEffect, useState } from "react";
import OutsideClickHandler from "react-outside-click-handler";
export const UserSearchResultsWidget: NLView<{ query: string }> = ({ query }) => {
const state = useAppState();
const actions = useActions();
const res = state.lists.search.users.results;
useEffect(() => {
actions.lists.searchUsers({ query });
}, [query]);
return (
{res && res?.value?.length ? (
) : res && !res?.value?.length ? (
"No results"
) : (
""
)}
);
};
export const TagsAutosuggestWidget: NLView<{ query: string }> = ({ query }) => {
const state = useAppState();
const actions = useActions();
const res = uniqBy(json(state.lists.search.tags.results)?.value || [], (t: any) => t.tag);
useEffect(() => {
actions.lists.searchTags({ query });
}, [query]);
return (
{res.length
? res.map((t: any) => (
actions.routing.historyPush({
location: `/search?tags=${t.tag}`,
})
}
>
{t.tag}
))
: res && !res?.length
? "No results"
: ""}
);
};
type SearchResultsWidget = typeof UserSearchResultsWidget;
const SearchResultsByMode = {
"@": UserSearchResultsWidget,
"#": TagsAutosuggestWidget,
};
export const SearchWidget: NLView<{
user?: UserReadPrivateResponse;
// search: boolean;
// setSearch: React.Dispatch>;
}> = ({ user }) => {
const state = useAppState();
const [query, setQuery] = useState("");
const [mode, setMode] = useState("#");
const [resultsVisible, setResultsVisible] = useState(false);
const [SearchResultsWidget, setSearchResultsWidget] = useState<{
component: SearchResultsWidget;
}>({ component: TagsAutosuggestWidget });
const actions = useActions();
const currQuery = mode == "#" ? state.lists.search.posts.query : state.lists.search.users.query;
// const setQuery = mode == "#" ? actions.lists.searchTags : actions.lists.searchUsers;
const [search, setSearch] = useState(false);
useEffect(() => {
if (/^[\@\#]$/.test(query)) {
setMode(query);
setSearchResultsWidget({ component: SearchResultsByMode[query] });
setQuery("");
return;
}
// if(query.startsWith("#") && query.length > 3)
// actions.lists.searchTags({ query });
}, [query]);
useEffect(() => {
if (currQuery == query) return;
setQuery(currQuery);
setResultsVisible(false);
}, [currQuery]);
return (
setSearch(!search)}>
{
setResultsVisible(false);
}}
>
{search && (
}
>
{
const q = query;
// setQuery("");
// actions.lists.searchPosts({ tags: q, force: true });
if (mode == "#") {
setTimeout(
() =>
actions.routing.historyPush({
location: `/search?tags=${q}`,
}),
100,
);
setResultsVisible(false);
}
}}
suffix={
search && (
setSearch(false)}
style={{
position: "absolute",
right: 0,
color: "white",
// top: "20px",
fontSize: "15px",
}}
>
Cancel
)
}
onFocus={() => setResultsVisible(true)}
onChange={(e) => {
if (e.target.value == "#") {
actions.routing.historyPush({
location: "/search",
});
setSearch(false);
} else setQuery(e.target.value);
setResultsVisible(!!e.target.value);
}}
style={
query === ""
? {
opacity: "80%",
width: "100%",
}
: {
opacity: "100%",
width: "100%",
}
}
value={query}
/>
)}
);
};